/*
1:安装axios
2:导入axios
3:创建axios副本，设置基地址
4：配制副本的请求拦截与响应拦截
5:暴露axios副本
*/
import axios from 'axios'
import { Toast } from 'vant'
import store from '@/store'
// Toast===this.$toast
const _axios = axios.create({
  baseURL: 'http://toutiao.itheima.net/'
})
_axios.interceptors.request.use(
  config => {
    // console.log('config', config)
    // config.method = 'post'
    // 加token
    // 需要加token的你才加，不需要的你不要加，加了我直接报错
    // 基本上绝大部分接口都要token，只有几个接口不需要token
    if (!config.noToken) {
      config.headers.Authorization = `Bearer ${store.state.token.token}`
    }

    // 所有接口都加入了token,都不会报错
    // config.headers.Authorization = `Bearer ${store.state.token.token}`
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
_axios.interceptors.response.use(
  res => {
    // return res
    // console.log('response', res)
    // res.data.data.name = '84期真牛'
    return res
    // return Promise.reject(new Error('error123'))
  },
  async error => {
    // 统一错误提示，只针对 后端 服务器返回了非200状态码的错误
    if (error.response && error.response.data) {
      // console.log('error', error)
      // 如果是401:mutations的退出处理
      if (error.response.status === 401) {
        // 抢救token过程：调用接口（不希望再走请求拦截与响应拦截）获取最新token,修改vuex中的token，再进行上次的接口请求
        try {
          const res2 = await axios({
            url: 'https://toutiao.itheima.net/v1_0/authorizations',
            method: 'put', // put修改
            headers: {
              Authorization: `Bearer ${store.state.token.refresh_token}`
            }
          })
          // 存储抢救过来得到的token并存储到vuex
          store.commit('setToken', {
            token: res2.data.data.token,
            refresh_token: store.state.token.refresh_token
          })
          // 再进行上次的接口请求
          const res3 = await _axios(error.config)
          return res3
        } catch {
          // 抢救失败
          store.commit('logout')
        }
        // console.log('抢救返回值', res2)
      }
      Toast.fail(error.response.data.message)
    }
    return Promise.reject(error)
  }
)
export default _axios
